M2.859 · Visualización de datos · PEC2
2022-2 · Máster universitario en Ciencia de datos (Data science)
Estudios de Informática, Multimedia y Telecomunicación
PEC2: Estudio de técnicas de visualización de datos¶
En esta actividad el estudiante tendrá que crear tres pequeñas visualizaciones usando técnicas diferentes que le serán asignadas, recibiréis un correo de vuestro profesor con la selección. Cada estudiante tendrá que escoger unos datos idóneos para cada una de las técnicas propuestas y decidir con qué software las crea. Los datos se podrán escoger de cualquier fuente de datos abiertos. El estudiante publicará las representaciones a Internet y las presentará en un video.
- Presentaos siguiendo el esquema de la PEC 1.
- [5%] Indicad donde está colgada la visualización para poder acceder.
- [30%] Definid cada técnica de visualización de forma general: nombre, origen, descripción/funcionamiento, ejemplos de aplicación, etc.
- [10%] Describid el tipo de datos que se pueden representar con cada técnica ¿(datos cuantitativos, cualitativos? ¿Qué estructura tienen que tener para cada técnica?). Explicad las limitaciones en cuanto a datos (¿hay medida mínima y máxima del juego de datos para cada técnica?).
- [20%] Haced una representación con cada una de las técnicas usando un conjunto de datos abiertos ( más abajo disponéis de algunas fuentes de datos abiertos). En total hay que hacer 3 representaciones simples con 3 conjuntos de datos escogidos por el estudiante.
- [30%] Comentad brevemente las tres representaciones indicando qué se representa y qué o qué aspectos muestra o demuestra cada representación.
- [5%] Cada una de las tres presentaciones tienen que tener una duración de unos 2-3 minutos. En total, el video (único) con las tres técnicas no puede exceder los 7 minutos. Se penalizará salir de este rango, porque se valora la capacidad de síntesis y de comunicación.
DNI: 52769480M
Correo: dmartial@uoc.edu
1. Heatmap¶
Técnica de visualización¶
nombre, origen, descripción/funcionamiento, ejemplos de aplicación, etc.
- Nombre: Heatmap o Mapa de Calor
- Origen: El concepto de mapa de calor se deriva del campo de la cartografía, pero se ha extendido a diversas disciplinas, incluyendo la visualización de datos.
- Descripción: Un mapa de calor es una representación visual de datos en forma de una matriz en la que los valores individuales están representados como colores. Se utiliza para visualizar la intensidad de una variable en dos dimensiones, generalmente a lo largo de ejes espaciales o temporales. Los colores más oscuros suelen indicar valores más altos o bajos, dependiendo del contexto.
- Ejemplos de Aplicación:
- Ciencia de Datos: Exploración de correlaciones en un conjunto de datos.
- Biología: Visualización de la expresión genética.
- Finanzas: Análisis de la fluctuación de precios a lo largo del tiempo.
Tipos de datos a representar¶
¿(datos cuantitativos, cualitativos? ¿Qué estructura tienen que tener para cada técnica?). Explicad las limitaciones en cuanto a datos (¿hay medida mínima y máxima del juego de datos para cada técnica?)
- Tipo de Datos Representados: Principalmente datos cuantitativos. Se utilizan para representar la relación entre dos variables continuas.
- Estructura de Datos: Matriz bidimensional. Cada celda de la matriz representa un valor en la intersección de una fila y una columna.
- Limitaciones:
- Interpretación Incorrecta: Sin una escala adecuada, la interpretación de colores puede ser errónea.
- Sensibilidad a la Escala de Colores: La elección de la paleta de colores puede influir en la percepción de los datos. Estas descripciones son generales y podrían variar dependiendo del contexto específico de la aplicación y de las herramientas de visualización utilizadas. Cada técnica tiene sus propias fortalezas y limitaciones, y es importante elegir la que mejor se adapte a los datos y los objetivos de la visualización.
- Tamaño del Conjunto de Datos: Los mapas de calor son más efectivos con conjuntos de datos de tamaño moderado a grande para revelar patrones significativos.
Origen de datos elegido¶
- Repositorio de datos elegido: The Home of the U.S. Government's Open Data
- Url: https://data.gov/
- Dataset elegido: Crime Data from 2020 to Present - City of Los Angeles
- Descripción: This dataset reflects incidents of crime in the City of Los Angeles dating back to 2020. This data is transcribed from original crime reports that are typed on paper and therefore there.
- Url info dataset: https://catalog.data.gov/dataset/crime-data-from-2020-to-present
- Url dataset: https://data.lacity.org/api/views/2nrs-mtv8/rows.csv?accessType=DOWNLOAD
- Publicador:
- Licencia:
En el siguiente código se obtienen los datos del dataset y se muestra una serie de información de utilidad para conocer por ejemplo el número de registros, número de columnas y otros datos similares de utilidad a la hora de conocer el dataset y poder procesar los datos del mismo.
import os
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
# Ruta al archivo CSV
archivo_csv = os.path.join('datasets', 'Crime_Data_from_2020_to_Present.csv')
# Cargar datos desde el archivo CSV
df_original = pd.read_csv(archivo_csv, sep=',')
# print(df_original.head())
# print(df_original.describe())
# print(df_original.shape)
# print(df_original.columns)
# Reducimos el dataset obteniendo aleatoriamente 390000 registros ya que Github solo permite ficheros de menos de 100MB
df = df_original.sample(n=390000, random_state=42)
# print(df.head())
# print(df.describe())
# print(df.shape)
# print(df.columns)
df.to_csv('./datasets/Crime_Data_from_2020_to_Present_reducido_aleatorio.csv', index=False)
COLUMNAS = ['AREA NAME', 'Vict Sex']
PD: se ha reducido el dataset a 399000 registros por la limitación de Github a no soportar ficheros de más de 100MB
Representación de los datos¶
probabilidad_asalto = df.groupby(['AREA NAME', 'Crm Cd Desc']).size() / df.groupby('AREA NAME').size()
probabilidad_asalto = probabilidad_asalto.unstack().fillna(0)
plt.figure(figsize=(10, 8))
sns.heatmap(probabilidad_asalto, cmap='YlGnBu', annot=False, cbar_kws={'label': 'Probabilidad de Asalto'})
plt.title('Porcentajes de Asalto por Tipo en Cada Área - Los Ángeles')
plt.show()
probabilidad_asalto = df.groupby(['AREA NAME', 'Vict Sex']).size() / df.groupby('AREA NAME').size()
probabilidad_asalto = probabilidad_asalto.unstack().fillna(0)
plt.figure(figsize=(10, 8))
sns.heatmap(probabilidad_asalto, cmap='YlGnBu', annot=False, cbar_kws={'label': 'Probabilidad de Asalto'})
plt.title('Porcentajes de Asalto por Sexo y Área - Los Ángeles')
plt.show()
Comentarios sobre la representación¶
Comentad brevemente las tres representaciones indicando qué se representa y qué o qué aspectos muestra o demuestra cada representación
2. Sunburst chart¶
Técnica de visualización¶
nombre, origen, descripción/funcionamiento, ejemplos de aplicación, etc.
- Nombre: Sunburst Chart (Gráfico Sunburst).
- Origen: Los gráficos Sunburst son una evolución de los gráficos de anillo y se han popularizado en la visualización de datos interactiva.
- Descripción: Un gráfico Sunburst es una representación visual de datos jerárquicos que se organiza en anillos concéntricos. Cada anillo representa un nivel jerárquico, y las secciones en cada anillo se dividen proporcionalmente según los valores que representan. La estructura se asemeja a los anillos de un árbol, y la forma general del gráfico se parece a un sol (sunburst en inglés), de ahí su nombre. Estos gráficos son particularmente útiles para mostrar la descomposición de un todo en sus partes.
- Ejemplos de Aplicación:
- Organización Empresarial: Visualización de la estructura jerárquica de una empresa.
- Desglose de Gastos: Representación de cómo se distribuyen los gastos en un presupuesto.
- Análisis de Ventas: Visualización de las categorías de productos y sus subcategorías en un negocio.
Tipos de datos a representar¶
¿(datos cuantitativos, cualitativos? ¿Qué estructura tienen que tener para cada técnica?). Explicad las limitaciones en cuanto a datos (¿hay medida mínima y máxima del juego de datos para cada técnica?)
- Tipo de Datos Representados: Datos jerárquicos. Muestra la relación entre un elemento principal y sus subelementos.
- Estructura de Datos: La estructura de datos se organiza jerárquicamente. Cada nivel jerárquico se representa en un anillo, y las secciones de cada anillo representan las subcategorías o subdivisiones de la categoría superior.
- Limitaciones:
- Complejidad: Puede volverse difícil de interpretar con muchas capas o niveles.
- Espacio: Requiere espacio suficiente para mostrar todos los niveles de manera clara.
- Interactividad Necesaria: Para conjuntos de datos grandes, la interactividad puede ser esencial para explorar eficientemente la información. Al igual que con cualquier técnica de visualización, es crucial adaptar el gráfico Sunburst al contexto específico y a los datos que se están representando. Estos gráficos son especialmente efectivos cuando se busca comunicar la estructura jerárquica y las relaciones entre distintas categorías y subcategorías en un conjunto de datos.
Origen de datos elegido¶
- Repositorio de datos elegido: Portal datos abiertos del Gobierno de España
- Url: https://datos.gob.es/es
- Dataset elegido: Ocupados por situación profesional, sexo y sector económico, por comunidad autónoma. EPA (Identificador API: 4018)
- Descripción: Tabla de INEbase Ocupados por situación profesional, sexo y sector económico, por comunidad autónoma. Trimestral. Comunidades y Ciudades Autónomas. Encuesta de Población Activa (EPA)
- Url info dataset: https://datos.gob.es/es/catalogo/ea0010587-ocupados-por-situacion-profesional-sexo-y-sector-economico-por-comunidad-autonoma-epa-identificador-api-4018
- Url dataset: https://www.ine.es/jaxiT3/files/t/csv_bdsc/4018.csv
- Publicador: Instituto Nacional de Estadística (MINISTERIO DE ASUNTOS ECONÓMICOS Y TRANSFORMACIÓN DIGITAL)
- Licencia: https://www.ine.es/aviso_legal
En el siguiente código se obtienen los datos del dataset y se muestra una serie de información de utilidad para conocer por ejemplo el número de registros, número de columnas y otros datos similares de utilidad a la hora de conocer el dataset y poder procesar los datos del mismo.
import pandas as pd
import plotly.express as px
import plotly.graph_objects as go
import os
# Ruta al archivo CSV
archivo_csv = os.path.join('datasets', '4018.csv')
# Cargar datos desde el archivo CSV
df = pd.read_csv(archivo_csv, sep=';')
# Cambiamos los valores .. por NA
df['Total'] = df['Total'].replace('..', pd.NA)
# Eliminar filas con valores NaN en la columna 'Total'
df = df.dropna(subset=['Total'])
# Convertir la columna 'Total' a tipo numérico
df['Total'] = pd.to_numeric(df['Total'], errors='coerce')
# Eliminamos los totales de todas las columnas a visualizar
df_filtrado = df[(df['Comunidades y Ciudades Autónomas'] != 'Total') & (df['Sector económico'] != 'Total') & (df['Situación profesional'] != 'Total')]
# df_filtrado = df[df['Sector económico'] != 'Total']
# df_filtrado = df[df['Situación profesional'] != 'Total']
Representación de los datos¶
# Crear el gráfico sunburst
fig = px.sunburst(
df_filtrado,
# path=['Comunidades y Ciudades Autónomas', 'Situación profesional', 'Sector económico'],
path=['Comunidades y Ciudades Autónomas', 'Sector económico', 'Situación profesional'],
# path=['Sector económico', 'Situación profesional'],
values='Total',
title='Sunburst por Comunidades y Ciudades Autónomas, Sector económico y Situación profesional (2008T4)',
width=800, # Set the width of the plot
height=800 # Set the height of the plot
)
# Mostrar el gráfico
fig.show()
Comentarios sobre la representación¶
Comentad brevemente las tres representaciones indicando qué se representa y qué o qué aspectos muestra o demuestra cada representación
3. Horizon graph¶
Técnica de visualización¶
nombre, origen, descripción/funcionamiento, ejemplos de aplicación, etc.
- Nombre: Horizon Plot o Gráfico de Horizonte.
- Origen: La técnica de Horizon Plot se originó en la visualización de series temporales y fue introducida por primera vez por Heer y Agrawala en 2009.
- Descripción: Un Horizon Plot es una forma de visualizar series temporales comprimiendo la información en una visualización más compacta. Se divide el eje vertical en múltiples bandas (horizontes), cada una representando una porción de los datos. Cada banda se colorea para indicar la dirección y la magnitud del cambio en los datos en ese período de tiempo. El objetivo es proporcionar una visión general de la variabilidad y tendencia temporal de los datos.
- Ejemplos de Aplicación:
- Finanzas: Seguimiento de la variación de precios de acciones a lo largo del tiempo.
- Meteorología: Visualización de patrones climáticos a lo largo de los años.
- Producción: Monitoreo de rendimiento de una máquina en un entorno de fabricación.
Tipos de datos a representar¶
¿(datos cuantitativos, cualitativos? ¿Qué estructura tienen que tener para cada técnica?). Explicad las limitaciones en cuanto a datos (¿hay medida mínima y máxima del juego de datos para cada técnica?)
- Tipo de Datos Representados : Principalmente datos cuantitativos y temporales. Adecuado para series temporales continuas.
- Estructura de Datos : Se requieren datos temporales unidimensionales. Cada punto de datos debe tener una marca de tiempo asociada.
- Limitaciones :
- Cantidad de Datos : A medida que aumenta la cantidad de datos, la visualización puede volverse saturada y difícil de interpretar.
- Sensibilidad a la Configuración : La interpretación puede variar según la configuración específica de colores y escalas utilizada.
- Requiere Datos Temporales : Es más eficaz para datos temporales y puede no ser tan útil para otros tipos de datos. En cuanto a medidas mínimas y máximas del juego de datos, no hay restricciones estrictas, pero la eficacia del gráfico puede variar según la cantidad de datos y la variabilidad en la serie temporal. La interpretación también depende de la capacidad del observador para distinguir los patrones en las bandas coloreadas. Es importante adaptar la técnica a los datos específicos y ajustar parámetros según sea necesario.
Origen de datos elegido¶
- Repositorio de datos elegido: Portal de Datos Abiertos de la Generalitat Valenciana
- Url: https://portaldadesobertes.gva.es/es
- Dataset elegido: COVID-19 Serie de casos con PDIA positiva en la Comunitat Valenciana, según fecha en la que el laboratorio notifica el diagnóstico
- Descripción: Información del número de casos de COVID-19 en la Comunidad Valenciana, tanto información agrupada como detallada a nivel de departamentos de salud.
- Url info dataset: https://dadesobertes.gva.es/es/dataset/covid-19-series-casos-pdia-positiva/resource/cb50e7d2-0c0e-46b8-a359-a0fa35998577
- Url dataset: https://dadesobertes.gva.es/dataset/ce195af2-39ec-4f44-bb77-b14235519b0d/resource/cb50e7d2-0c0e-46b8-a359-a0fa35998577/download/covid-19-serie-de-casos-con-pdia-positiva-en-la-comunitat-valenciana.csv
- Publicador: Generalitat Valenciana
- Licencia: http://www.opendefinition.org/licenses/cc-by
En el siguiente código se obtienen los datos del dataset y se muestra una serie de información de utilidad para conocer por ejemplo el número de registros, número de columnas y otros datos similares de utilidad a la hora de conocer el dataset y poder procesar los datos del mismo.
import pandas as pd
import plotly.express as px
import plotly.graph_objects as go
import os
COLUMNAS = ['Data diagnòstic laboratori/fecha diagnóstico laboratorio', 'C.Valenciana', 'Homes/Hombres','Dones/Mujeres','Prov. Alacant/Alicante','Prov. Castelló/Castellón','Prov. València']
COL_FECHA = 0
COL_ALICANTE = 4
COL_CASTELLON = 5
COL_VALENCIA = 6
# Ruta al archivo CSV
archivo_csv = os.path.join('datasets', 'covid-19-serie-de-casos-con-pdia-positiva-en-la-comunitat-valenciana.csv')
# Cargar datos desde el archivo CSV
df = pd.read_csv(archivo_csv, sep=';')
# print(df.head())
# print(df.describe())
# print(df.shape)
# print(df.columns)
# Nos quedamos solo con las columnas que nos interesan
# df_nuevo = df[COLUMNAS]
# COL_FECHA = 0
# COL_ALICANTE = 1
# COL_CASTELLON = 2
# COL_VALENCIA = 3
Representación de los datos¶
# Crear el gráfico de horizonte con plotly
fig = go.Figure()
fig.add_trace(go.Scatter(x=df[COLUMNAS[0]], y=df[COLUMNAS[COL_ALICANTE]], fill='tozeroy', name='Alicante'))
fig.add_trace(go.Scatter(x=df[COLUMNAS[0]], y=df[COLUMNAS[COL_CASTELLON]], fill='tozeroy', name='Castellón'))
fig.add_trace(go.Scatter(x=df[COLUMNAS[0]], y=df[COLUMNAS[COL_VALENCIA]], fill='tozeroy', name='Valencia'))
# Personalizar el diseño
fig.update_layout(
title='COVID-19 Serie de casos con PDIA positiva en la Comunitat Valenciana - por provincias',
xaxis_title='Fecha',
yaxis_title='Casos de COVID',
width=1000, # Set the width of the entire figure
height=800 # Set the height of the entire figure
)
# Mostrar el gráfico
fig.show()
Comentarios sobre la representación¶
Comentad brevemente las tres representaciones indicando qué se representa y qué o qué aspectos muestra o demuestra cada representación